/**
 * 键盘快捷键管理器
 */
export class KeyboardManager {
  constructor(graphManager) {
    this.graphManager = graphManager
    this.handler = null
    this.dialogVisibleCheck = null // 对话框状态检查回调
    this.bindEvents()
  }

  /**
   * 设置对话框状态检查回调
   * @param {Function} checkCallback - 返回true表示对话框打开，false表示关闭
   */
  setDialogVisibleCheck(checkCallback) {
    this.dialogVisibleCheck = checkCallback
  }

  /**
   * 绑定键盘事件
   */
  bindEvents() {
    this.handler = (e) => {
      // 防止在输入框中触发快捷键
      if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') {
        return
      }
      
      // 防止在contenteditable元素中触发快捷键
      if (e.target.contentEditable === 'true') {
        return
      }
      
      // 防止在弹出框中触发快捷键
      if (e.target.closest('.context-menu') || e.target.closest('.ant-modal') || e.target.closest('.ant-drawer')) {
        return
      }
      
      // 检查节点配置对话框是否打开，如果打开则屏蔽所有快捷键
      if (this.dialogVisibleCheck && this.dialogVisibleCheck()) {
        return
      }
      
      // Ctrl + 0: 重置缩放
      if (e.ctrlKey && e.key === '0') {
        e.preventDefault()
        this.graphManager.resetZoom()
      }
      // Ctrl + +: 放大
      else if (e.ctrlKey && e.key === '=') {
        e.preventDefault()
        this.graphManager.zoomIn()
      }
      // Ctrl + -: 缩小
      else if (e.ctrlKey && e.key === '-') {
        e.preventDefault()
        this.graphManager.zoomOut()
      }
      // Ctrl + C: 居中显示
      else if (e.ctrlKey && e.key === 'c') {
        e.preventDefault()
        this.graphManager.centerContent()
      }
      // Delete 或 Backspace: 删除选中元素
      else if (e.key === 'Delete' || e.key === 'Backspace') {
        e.preventDefault()
        this.graphManager.deleteSelected()
      }
      // Ctrl + A: 全选
      else if (e.ctrlKey && e.key === 'a') {
        e.preventDefault()
        this.graphManager.selectAll()
      }
      // Ctrl + D: 取消选择
      else if (e.ctrlKey && e.key === 'd') {
        e.preventDefault()
        this.graphManager.clearSelection()
      }
      // Ctrl + Z: 撤销
      else if (e.ctrlKey && e.key === 'z') {
        e.preventDefault()
        this.graphManager.undo()
      }
      // Ctrl + Y: 重做
      else if (e.ctrlKey && e.key === 'y') {
        e.preventDefault()
        this.graphManager.redo()
      }
    }
    
    document.addEventListener('keydown', this.handler)
  }

  /**
   * 解绑键盘事件
   */
  unbindEvents() {
    if (this.handler) {
      document.removeEventListener('keydown', this.handler)
      this.handler = null
    }
  }

  /**
   * 销毁
   */
  dispose() {
    this.unbindEvents()
  }
} 